export default {}
/*
类的修饰符：
private age:number //表示这个属性是私有的属性，只能是当前class中访问；
                  子类，实例化对象中，不能访问； 也不能把类当一个对象使用时访问。
public name:string  //公共的属性，都可以使用，默认的。把类当对象时，不可使用。
protected gender:boolean  //只允许类内部和子类访问，实例化对象不能直接访问,在类的方法里面可以访问（实例化对象.方法名（）就可以访问。）
static create(name:string, age: number){ 
  //表示这个属性，只能被当前CLASS自已调用 ；也就是把类当对象使用。
}
readonly： 只读属性，不修改，当一个属性，同时又有前面4个修饰符之一时，readonly 写在修饰符的右侧。
*/

class Person {
  static readonly eatTime :number  = 1
  static sleeptime: number = 8  // es7出现的语法
  public uname:string = '秦始皇'

  private isStudy:boolean = true;

  protected sex:string = '男';
  constructor( name:string){
    this.uname = name
  }
 
  study(){
    // 私有的属性，只可以在当前类的方法中被使用。
    // console.log(this.isStudy);
    console.log(this.sex);
  }
}
class Student extends Person{
  constructor(name:string){
    super(name)
  }
  learning(){
    // console.log(this.isStudy); //属性“isStudy”为私有属性，只能在类“Person”中访问
    console.log(this.sex);
  }
}

// 把Person类当对象使用：
console.log(Person.sleeptime);
// console.log(Person.uname); // 类型“typeof Person”上不存在属性“uname”。 public 表示的属性，是不能被类对象调用

Person.sleeptime = 10

// Person.eatTime = 0.5  // 无法分配到 "eatTime" ，因为它是只读属性。 因为它是只读的属性

// 实例化一个人
let p1 = new Person('刘邦')
console.log(p1);
// console.log(p1.isStudy); //属性“isStudy”为私有属性，只能在类“Person”中访问。实例化对象.属性名的方式，不允许访问
// console.log(p1.sex); // 属性“sex”受保护，只能在类“Person”及其子类中访问, 实例化对象.属性名的方式，不允许访问

p1.study() // true

// 实例化一个学生
let s1 = new Student('小明')
console.log(s1);

// console.log(s1.isStudy); // 属性“isStudy”为私有属性，只能在类“Person”中访问。
// console.log(s1.sex);// 属性“sex”受保护，只能在类“Person”及其子类中访问, 实例化对象.属性名的方式，不允许访问
s1.study()
s1.learning()